home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / cprog / tdddconv.lha / sort.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-12  |  1.1 KB  |  44 lines

  1. /* sort.c - Shell-Metzner sort algorithm implemented by Glenn M. Lewis - 7/26/91
  2.  */
  3.  
  4. #include <stdio.h>
  5. #include "ttdddlib.h"
  6.  
  7. static char rcs_id[] = "$Id: sort.c,v 1.3 1991/09/05 17:51:13 glewis Exp glewis $";
  8.  
  9. void swap_points(desc, p1, p2)
  10. register DESC *desc;
  11. register int p1, p2;
  12. {
  13.     register UWORD *edge;
  14.     register int i;
  15.     XYZ_st tmp;
  16.     if (p1==p2) return;
  17.     for (edge=desc->edge,i=2*desc->ecount; i--; edge++) {
  18.         if (*edge==p1) *edge=p2;
  19.         else if (*edge==p2) *edge=p1;
  20.     }
  21.     bcopy((char*)&desc->pnts[p1], (char*)&tmp, sizeof(XYZ_st));
  22.     bcopy((char*)&desc->pnts[p2], (char*)&desc->pnts[p1], sizeof(XYZ_st));
  23.     bcopy((char*)&tmp, (char*)&desc->pnts[p2], sizeof(XYZ_st));
  24. }
  25.  
  26. void sort_points(desc, cmp)    /* Sort the boxes w/ Shell-Metzner algorithm */
  27. register DESC *desc;
  28. int (*cmp)();
  29. {
  30.     register int i, j, gap;
  31.  
  32. /* Sort the puppies! */
  33.  
  34.     if (desc->pcount <= 1) return;
  35.     for (gap = desc->pcount/2; gap>0; gap/=2)
  36.         for (i=gap; i<desc->pcount; i++)
  37.             for (j=i-gap; j>=0; j-=gap) {
  38.                 if (cmp(&desc->pnts[j], &desc->pnts[j+gap])<0) break;
  39.                 /* Swap the points */
  40.                 swap_points(desc, j, j+gap);
  41.             }
  42. }
  43.  
  44.